package logica;

import datos.Bloque;
import datos.Factory;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import presentacion.VentanaMapBuilder;

public class ControladorMapa {

    private VentanaMapBuilder vmb;
    private ControladorMouse cmouse;
    private SessionFactory sessionFactory;
    private List<Bloque> listaBloques;
    private List<ElementoMapa> listaElementos;
    private int panelX;
    private int panelY;
    private int tamanioBloques = 32;
    private boolean mousePresionado;
    String nombreMapa;

    public ControladorMapa(VentanaMapBuilder ventanaMapBuilder) {
        mousePresionado = false;
        this.vmb = ventanaMapBuilder;
        listaElementos = new ArrayList<>();
    }

    private void ConstruirMapa() {
        int index = 0;
        /* Agregamos elementos al Panel Editor */
        for (ElementoMapa elemento : listaElementos) {
            elemento.setIndex(index);
            index++;
            vmb.getPanel_editorMapa().add(elemento.getLabelImagen());
        }

        /* Agregamos un MouseListener a cada elemento del mapa */
        for (int i = 0; i < listaElementos.size(); i++) {
            listaElementos.get(i).getLabelImagen().addMouseListener(cmouse = new ControladorMouse(vmb) {
                public void mouseClicked(MouseEvent me) {
                    if (vmb.getHerram_btnPuntero().isSelected()) {
                        cmouse.ActivarPropiedadesBloque(me, "Propiedades");
                        cmouse.ActivarBordeBloque(me, true);
                    }
                }

                public void mousePressed(MouseEvent me) {
                    mousePresionado = true;
                    if (vmb.getHerram_btnLapiz().isSelected() && mousePresionado == true) {
                        cmouse.PintarBloque(me, vmb.getCe().getElementoAPintar());
                        //cm.setElementoMapaList(elementosMapa);
                    }
                }

                public void mouseReleased(MouseEvent me) {
                    mousePresionado = false;
                }

                public void mouseEntered(MouseEvent me) {
                    if (vmb.getHerram_btnLapiz().isSelected() && mousePresionado == true) {
                        cmouse.PintarBloque(me, vmb.getCe().getElementoAPintar());
                        //cm.setElementoMapaList(elementosMapa);
                    }
                    cmouse.ActivarBordeBloque(me, false);
                }

                public void mouseExited(MouseEvent me) {
                    cmouse.DesactivarBordeBloque(me);
                }
            });
        }
        vmb.getPanel_editorMapa().repaint();
    }

    public void NuevoMapa(String autor, String nombre, String descripcion, int tamanioBloques, int columnas, int filas, Date fecha) {
        sessionFactory = Factory.getSessionFactory();
        Session session = sessionFactory.openSession();
        Query query = session.createQuery("FROM Bloque");
        listaBloques = query.list();
        CerrarMapa();
        for (int i = 0; i < filas; i++) {
            panelX = 0;
            for (int j = 0; j < columnas; j++) {
                listaElementos.add(new ElementoMapa(listaBloques.get(0), (j * tamanioBloques), (i * tamanioBloques), tamanioBloques));
                panelX += tamanioBloques;
            }
            panelY += tamanioBloques;
        }
        ConstruirMapa();
    }

    public boolean AbrirMapa(File archivoMapa) {
        sessionFactory = Factory.getSessionFactory();
        Session session = sessionFactory.openSession();
        Query query = session.createQuery("FROM Bloque");
        listaBloques = query.list();
        CerrarMapa();
        int numLinea = 0;
        nombreMapa = "";
        String idBloque = "";
        String posX = "";
        String posY = "";
        int numIdBloque = 0;
        int numPosX = 0;
        int numPosY = 0;
        int dato = 0;
        listaElementos.clear();
        try {
            BufferedReader br = new BufferedReader(new FileReader(archivoMapa));
            String linea;
            while ((linea = br.readLine()) != null) {
                if (numLinea == 0) {
                    nombreMapa = linea;
                } else if (numLinea > 0) {
                    dato = 0;
                    idBloque = "";
                    posX = "";
                    posY = "";
                    for (int i = 0; i < linea.length(); i++) {
                        if (dato == 0) {
                            idBloque = idBloque + linea.charAt(i);
                        } else if (dato == 1) {
                            posX = posX + linea.charAt(i);
                        } else if (dato == 2) {
                            posY = posY + linea.charAt(i);
                        }
                        if (linea.charAt(i) == ' ') {
                            dato++;
                        }
                    }
                }
                if (numLinea > 0) {
                    numIdBloque = Integer.parseInt(idBloque.trim());
                    numPosX = Integer.parseInt(posX.trim());
                    numPosY = Integer.parseInt(posY.trim());
                    listaElementos.add(new ElementoMapa(listaBloques.get(numIdBloque - 1), numPosX, numPosY, tamanioBloques));
                }
                numLinea++;
            }
            br.close();
            ConstruirMapa();
            return true;
        } catch (IOException | NumberFormatException e) {
            return false;
        }
        
    }

    public void GuardarMapa(File archivoMapa, Path ruta) {
        try {
            BufferedWriter out = new BufferedWriter(new FileWriter(ruta + "/" + archivoMapa.getName() + ".map"));
            sessionFactory = Factory.getSessionFactory();
            Session session = sessionFactory.openSession();
            out.write(archivoMapa.getName());
            for (ElementoMapa elemento : listaElementos) {
                out.newLine();
                out.write(elemento.getBloque().getIdBloque() + " " + elemento.getPosX() + " " + elemento.getPosY());
            }
            out.close();
        } catch (IOException e) {
        }
    }

    public void CerrarMapa() {
        listaElementos.clear();
        vmb.getPanel_editorMapa().removeAll();
        vmb.getPanel_editorMapa().repaint();
    }

    // <editor-fold desc="Getters & Setters" defaultstate="collapsed">
    public List<Bloque> getEntidadBloqueList() {
        return listaBloques;
    }

    public void setElementoMapaList(List<ElementoMapa> elementoMapaList) {
        this.listaElementos = elementoMapaList;
    }

    public List<ElementoMapa> getElementosMapa() {
        return listaElementos;
    }

    public int getPanelTamanioX() {
        return panelX;
    }

    public int getPanelTamanioY() {
        return panelY;
    }

    public int getTamanioBloques() {
        return tamanioBloques;
    }
public String getNombreMapa() {
        return nombreMapa;
    }
    /*public void setTamanioBloques(int tamanioBloques) {
     ControladorMapa.tamanioBloques = tamanioBloques;
     }*/
    // </editor-fold>
    
}
